查看原文
其他

extruct提取结构化数据

2018-01-20

作者 大邓

extruct库

extruct库可以从HTML标记语言中抽取嵌入的metadata数据。目前支持的数据格式有:

  • w3c的html microdata

  • 嵌入在html中的JSON-LD数据

先看看Microdata和JSON-LD分别是什么样子的数据:

Microdata

<div itemprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating">    
   <meta itemprop="worstRating" content="1">    
   <meta itemprop="bestRating" content="5">    
   <div class="bbystars-small-yellow">        
       <div class="fill" style="width: 88%"></div>    
   </div>    
   <span itemprop="ratingValue" aria-label="4.4 out of 5 stars">4.4</span>    
   <meta itemprop="reviewCount" content="305733">

</div>

乍看起来跟普通的html没啥区别,确实我一开始也没觉得有多特别,但是仔细一看,itemprop itemscope itemtype这些关键词是很不一样的。能够指示范围,说明标签的具体属性。这些不同寻常的地方是因为这个html使用了Schema结构化范式,这样标记的数据的网站更容易被搜索引擎公司采集分析。具体可以看看Schema.org官网学习下,网址

https://schema.org/AggregateRating

像这个差评,worstRating

<meta itemprop="worstRating" content="1">

好评

<meta itemprop="bestRating" content="5">

提取Microdata

像这种microdata方式的结构化数据,可以使用extruct库提取html中的数据,返回json格式数据。

from extruct.w3cmicrodata import MicrodataExtractor

mde = MicrodataExtractor()

data = mde.extract(html_content)

print(data)

print(data['items'][0]['properties']['ratingValue'])
{  'items': [    {      'type': 'http://schema.org/AggregateRating',      'properties': {        'reviewCount': '305733',        'bestRating': '5',        'ratingValue': u'4.4',        'worstRating': '1'      }    }  ]}

4.4

JSON-LD

html = """
<html>    <head>        <title>Some Person Page</title>    </head>    <body>        <h1>This guys</h1>        <script type="application/ld+json">        {        "@context": "http://schema.org",        "@type": "Person",        "name": "John Doe",        "jobTitle": "Graduate research assistant",        "affiliation": "University of Dreams",        "additionalName": "Johnny",        "url": "http://www.example.com",        "address": {            "@type": "PostalAddress",            "streetAddress": "1234 Peach Drive",            "addressLocality": "Wonderland",            "addressRegion": "Georgia"                }        }        
       </script>    </body>
</html>"""

这个比较好区分,代码中嵌入着很标准的json格式字符串。一般遇到这种场景,我一般用正则抽取。html中有 

<script type="application/ld+json">

标记这个标签是使用的JSON-LD,extruct可以很轻易的就提取出json数据。

提取JSON-LD数据

from extruct.jsonld import JsonLdExtractor
jslde = JsonLdExtractor()

data = jslde.extract(html)

print(data)
[{'@context': 'http://schema.org',  '@type': 'Person',  'additionalName': 'Johnny',  'address': {'@type': 'PostalAddress',              'addressLocality': 'Wonderland',              'addressRegion': 'Georgia',              'streetAddress': '1234 Peach Drive'},  'affiliation': 'University of Dreams',  'jobTitle': 'Graduate research assistant',  'name': 'John Doe',  'url': 'http://www.example.com'}]

更多extruct详细内容,可以查看github上该项目的信息。

总结

目前使用schema样式建站的还很少,但未来肯定是趋势。百度搜索了下相关的词


schame这种结构化的数据,可以让搜索引擎更容易抓到,并提取出有用的信息。大数据时代,不只是要抓到数据,建站的人也要提前布局,将数据更容易展示,更容易使用才是正道。

所以,extruct库可能用到的时候很少,但是通过这个库知道schma这种范式标记的html也是收获吧。也许不远的未来,不用定位解析html,我们就能用extruct以json样式的输出的数据。想想都期待啊!!

相关阅读

Python中处理日期时间库的使用方法

三分钟掌握文件格式识别

为什么你要为2019,而不是2018做计划?

2017年度15个最好的数据科学领域Python库

迅雷不给力,我DIY了个下载器

计算运行时间-装饰器实现

花十分钟,给爱机安装个MongoDB

使用Python登录QQ邮箱发送QQ邮件

WTF Python: 开启你的懵逼模式

8行代码实现微信聊天机器人

优雅简洁的列表推导式

Get小技巧等分列表

如何对数据进行各种排序?

数据结构:队列与堆栈 

else除了跟if很搭,你还知道其他的关键词吗?

数据采集

【视频讲解】Scrapy递归抓取简书用户信息

【实战视频】使用scrapy写爬虫-爬知乎live

如何将html中的表格数据保存下来

美团商家信息采集神器

gevent:异步理论与实战

selenium驱动器配置详解

爬虫神器PyQuery的使用方法

简易SQLite3数据库学习

当爬虫遭遇验证码,怎么办


文本处理分析

gensim:用Word2Vec进行文本分析

RAKE:快速自动抽取关键词算法

对于中文,nltk能做哪些事情

基于共现发现人物关系的python实现

用pyecharts制作词云图

留在网上的每个字,都在泄露你的身份


图片数据处理

OpenCV:快速入门图片人脸识别

好玩的OpenCV:图片操作的基本知识(1)

好玩的OpenCV:图像操作的基本知识(2)

OpenCV:计算图片有多色


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存